class Solution {
    public String countAndSay(int n) {
        // 因为 countAndSay(n) 是 countAndSay(n-1) 的行程长度编码
        // 行程长度编码就是在"读"数据
        // 相当于求第n项，就是在"读"第n-1项
        
        if (n == 1) {
            return "1";
        }
        // 先拿到第n-1项的数据
        char[] ch = countAndSay(n-1).toCharArray();
        // 开始"读"数据：使用双指针分组数据
        StringBuilder sb = new StringBuilder();
        for (int left = 0, right = 0; right < ch.length;) {
            // 让 left 与 right 到达数组的两个边界
            // 注意：处理数组越界
            while (right < ch.length && ch[left] ==ch [right]) {
                right++;
            }
            // 开始"读"操作
            sb.append(right-left);
            sb.append(ch[left]);
            // 开始新的分组
            left = right;
        }
        return sb.toString();
    }
}